package com.webproject.core.service.impl;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.digest.MD5;
import com.webproject.core.base.BaseException;
import com.webproject.core.dao.UserMapper;
import com.webproject.core.model.User;
import com.webproject.core.service.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * AuthService 实现 标准
 */
@Service
public class AuthServiceImpl implements AuthService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 注册接口
     */
    @Override
    public User registerUser(String name, String password) throws BaseException {
        // 先校验是否存在这个用户名的用户 用户名不可重复 已在数据库做了唯一索引，不过不能指望通过数据库报错来做唯一，程序需要二次校验
        User checkUser = userMapper.findUserByName(name);
        if (checkUser != null){
            throw new BaseException("已经存在注册用户");
        }
        User user = new User();
        user.setId(UUID.randomUUID().toString().replace("-","")); // 用户id由uuid随机生成
        user.setUsername(name);
        user.setPassword(MD5.create().digestHex(password)); // 密码不能存储明文 开发规定 存储一次md5(为了简单不做加密 不加盐) 登录的时候同样用明文做一次md5 与数据库密码做比对
        user.setNickname(name); // 暂时使用用户的账号作为用户的昵称 昵称之后可以再用修改用户信息之类的功能进行修改 或者说使用随机工具随机一个用户昵称出来
        Integer insert = userMapper.insert(user);
        if (insert != 1){
            throw new BaseException("注册失败 稍后再试");
        }
        //  确定
        return user;
    }

    /**
     * 登录接口
     */
    @Override
    public User login(String name, String password) throws BaseException {
        // 查询用户是否存在
        User user = userMapper.findUserByName(name);
        if (user == null){
            // 库中并不存在该用户 报错出去让错误管理器统一处理
            throw new BaseException("用户不存在 请前往注册");
        }
        // md5后的密码 与db中的密码比对，如果符合就正常通过，不符合就代表密码错误
        String decodePassword = MD5.create().digestHex(password);
        if (!user.getPassword().equals(decodePassword)){
            throw new BaseException("账号或密码错误");
        }
        // 密码正确 返回正常用户信息
        return user;
    }
}
